import os
import argparse

def find_and_remove_symlinks(directory, dry_run=False):
    """
    遍历指定目录及其所有子目录，查找并删除符号链接。

    Args:
        directory (str): 要遍历的根目录路径。
        dry_run (bool): 如果为True，则只打印要删除的链接而不实际删除。默认为False。
    """
    found_count = 0
    removed_count = 0
    error_count = 0

    print(f"开始在目录 '{directory}' 中查找符号链接...（ dry_run 模式: {dry_run}）")
    print("-" * 60)

    # 使用 os.walk 递归遍历目录
    for root, dirs, files in os.walk(directory):
        # 检查当前目录本身是否为符号链接（某些系统允许目录也是符号链接）
        current_dir = root
        if os.path.islink(current_dir):
            found_count += 1
            try:
                if not dry_run:
                    os.unlink(current_dir)
                    print(f"[目录链接] 已删除: {current_dir}")
                else:
                    print(f"[目录链接] (dry run) 将删除: {current_dir}")
                removed_count += 1
            except OSError as e:
                error_count += 1
                print(f"[目录链接] 删除失败 {current_dir}: {e}")

        # 检查当前目录中的文件是否为符号链接
        files.extend(dirs)
        for name in files:
            file_path = os.path.join(root, name)
            if os.path.islink(file_path):
                found_count += 1
                try:
                    if not dry_run:
                        os.unlink(file_path)
                        print(f"[文件链接] 已删除: {file_path}")
                    else:
                        print(f"[文件链接] (dry run) 将删除: {file_path}")
                    removed_count += 1
                except OSError as e:
                    error_count += 1
                    print(f"[文件链接] 删除失败 {file_path}: {e}")

        # 注意：os.walk 默认会进入子目录，包括符号链接目录。
        # 如果你不希望进入符号链接目录，可以在遍历时修改 dirs 列表
        # 这里我们在遍历前先过滤掉符号链接目录，防止进入外部目录树
        # 注意：这不会阻止删除操作，只是控制遍历行为
        dirs[:] = [d for d in dirs if not os.path.islink(os.path.join(root, d))]

    # 输出统计结果
    print("-" * 60)
    print(f"操作完成。")
    print(f"找到符号链接总数: {found_count}")
    if not dry_run:
        print(f"成功删除数量: {removed_count}")
    else:
        print(f"(dry run) 可删除数量: {removed_count}")
    print(f"删除失败数量: {error_count}")


def main():
    # """主函数，解析命令行参数并执行操作"""
    # parser = argparse.ArgumentParser(description='查找并删除指定目录下的所有符号链接')
    # parser.add_argument('directory', help='要遍历的根目录路径')
    # parser.add_argument('--dry-run', action='store_true',
    #                     help='试运行模式，只打印不会实际删除任何文件')
    #
    # args = parser.parse_args()
    #
    # # 检查目录是否存在
    # if not os.path.exists(args.directory):
    #     print(f"错误：目录 '{args.directory}' 不存在")
    #     return
    #
    # if not os.path.isdir(args.directory):
    #     print(f"错误：'{args.directory}' 不是一个目录")
    #     return

    # find_and_remove_symlinks(args.directory, args.dry_run)
    find_and_remove_symlinks(r'E:\Shortcuts', dry_run=False)

if __name__ == "__main__":
    main()